package com.formiaomiao.demain.controller;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.formiaomiao.demain.model.ListUsername;
import com.formiaomiao.demain.model.UserBean;
import com.formiaomiao.demain.model.ValidateCode;
import com.formiaomiao.demain.service.UserService;
import com.formiaomiao.demain.utils.QiniuUtil;
import com.google.gson.Gson;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping(value = "/user")
public class UserController {
    @Autowired
    private UserService userService;
    QiniuUtil qiniuUtil = new QiniuUtil();
    HttpSession session;

    @ResponseBody
    @PostMapping("/register")
    public Object registerUser(UserBean userBean) {
        ValidateCode validateCode = (ValidateCode) session.getAttribute(userBean.getUserPhone());
        if (validateCode.getCode().equals(userBean.getValidateCode())) {
            userBean.setValidateCode("验证码正确");
        } else {
            userBean.setValidateCode("验证码错误");
        }
        return userService.registerUser(userBean);
    }

    @ResponseBody
    @RequestMapping("/signin")
    public Object SignInUser(
            @RequestParam(name = "userName", required = false)
                    String userName,
            @RequestParam(name = "passWord", required = false)
                    String passWord) {
        UserBean userBean = new UserBean();
        userBean.setUserName(userName);
        userBean.setPassWord(passWord);
        return userService.SignInUser(userBean);
    }

    /**
     * 上传文件到七牛云存储
     *
     * @param multipartFile
     * @return
     * @throws IOException
     */
    @RequestMapping("/updateHead")
    @ResponseBody
    public Object uploadImgQiniu(@RequestParam("headimg") MultipartFile multipartFile,
                                 @RequestParam(name = "id", required = false)
                                         Integer id) throws IOException {
        FileInputStream inputStream = (FileInputStream) multipartFile.getInputStream();
        String path = qiniuUtil.uploadImg(inputStream, "headimg" + id);
        UserBean userBean = new UserBean();
        userBean.setId(id);
        userBean.setUserHead(path);
        return userService.UpdateHead(userBean);
    }

    /**
     * 修改密码
     *
     * @param password
     * @param id
     * @return
     */
    @RequestMapping("/updatePwd")
    @ResponseBody
    public Object updatePwd(@RequestParam(value = "password", required = true) String password,
                            @RequestParam(value = "id", required = true) Integer id) {
        UserBean userBean = new UserBean();
        userBean.setId(id);
        userBean.setPassWord(password);
        return userService.UpdatePwd(userBean);
    }

    /**
     * 修改昵称
     *
     * @param nickName
     * @param id
     * @return
     */
    @RequestMapping("/updateNickName")
    @ResponseBody
    public Object updateNickName(@RequestParam(value = "nickName", required = true) String nickName,
                                 @RequestParam(value = "id", required = true) Integer id) {
        UserBean userBean = new UserBean();
        userBean.setId(id);
        userBean.setNickName(nickName);
        return userService.UpdateNickName(userBean);
    }

    /**
     * 忘记密码
     *
     * @return
     */
    @RequestMapping("/forgetPwd")
    @ResponseBody
    public Object forgetPwd(UserBean userBean) {
        ValidateCode validateCode = (ValidateCode) session.getAttribute(userBean.getUserPhone());
        if (validateCode.getCode().equals(userBean.getValidateCode())) {
            userBean.setValidateCode("验证码正确");
        } else {
            userBean.setValidateCode("验证码错误");
        }
        return userService.ForgetPwd(userBean);
    }

    /**
     * 发送短信
     *
     * @param phone
     * @param request
     * @return
     */
    @RequestMapping("/sendSMSMessage")
    @ResponseBody
    public Object sendSMSMessage(@RequestParam(value = "phone", required = true) String phone
            , HttpServletRequest request) {
        //设置超时时间-可自行调整
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
        //初始化ascClient需要的几个参数
        final String product = "Dysmsapi";//短信API产品名称（短信产品名固定，无需修改）
        final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名（接口地址固定，无需修改）
        //替换成你的AK
        final String accessKeyId = "LTAITsodH8fve8Nn";//你的accessKeyId,参考本文档步骤2
        final String accessKeySecret = "bAhSnyL2zqtvhchHIKjXEVWICW4KqY";//你的accessKeySecret，参考本文档步骤2
        //初始化ascClient,暂时不支持多region
        try {

            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
            //组装请求对象
            SendSmsRequest smsRequest = new SendSmsRequest();
            //必填:待发送手机号。支持以逗号分隔的形式进行批量调用，批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
            smsRequest.setPhoneNumbers(phone);
            //必填:短信签名-可在短信控制台中找到
            smsRequest.setSignName("Demain");
            //必填:短信模板-可在短信控制台中找到
            smsRequest.setTemplateCode("SMS_146800797");

            int ran = (int) (Math.random() * (9999 - 1000 + 1)) + 1000;//产生1000-9999的随机数
            String code = String.valueOf(ran);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            smsRequest.setTemplateParam("{\"code\":" + code + "}");

            //把短信验证码存入session
            session = request.getSession();
            ValidateCode validateCode = new ValidateCode();
            validateCode.setMobile(phone);
            validateCode.setCode(code);
            session.setAttribute(phone, validateCode);

            //可选-上行短信扩展码(无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            //request.setOutId("yourOutId");
            //请求失败这里会抛ClientException异常
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(smsRequest);
            System.out.println(sendSmsResponse.getCode());
            System.out.println(sendSmsResponse.getBizId());
            System.out.println(sendSmsResponse.getMessage());
            System.out.println(sendSmsResponse.getRequestId());
            if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
                //请求成功
                System.out.print("success");
                return userService.sendSMSMessage(true);
            }
        } catch (ClientException e) {
            return userService.sendSMSMessage(false);
        }
        System.out.print("fail");
        return userService.sendSMSMessage(false);
    }

    /**
     * 通过id获取详情
     *
     * @param id
     * @return
     */
    @RequestMapping("/selectUser")
    @ResponseBody
    public Object selectUser(@RequestParam(value = "id", required = true) Integer id) {
        UserBean userBean = new UserBean();
        userBean.setId(id);
        return userService.selectUser(userBean);
    }

    /**
     * 通过username获取详情
     *
     * @param username
     * @return
     */
    @RequestMapping(value = "/usernameselect")
    @ResponseBody
    public Object usernameselect(@RequestParam(value = "username", required = true) String username) {
        UserBean userBean = new UserBean();
        userBean.setUserName(username);
        return userService.usernameselect(userBean);
    }

    @RequestMapping(value = "/frienddetail")
    @ResponseBody
    public Object Listusernameselect(@RequestParam(value = "usernamejson", required = true) String usernamejson) {
        List<UserBean> list = new ArrayList<>();
        Gson gson = new Gson();
        ListUsername listUsername = new ListUsername();
        listUsername = gson.fromJson(usernamejson, ListUsername.class);
        for (int i = 0; i < listUsername.getData().size(); i++) {
            UserBean bean = new UserBean();
            bean.setUserName(listUsername.getData().get(i).getUsername());
            list.add(bean);
        }
        return userService.Listusernameselect(listUsername.getUserid(), list);
    }
}
